package com.cow.framework.utils.json;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.cow.framework.utils.date.DateUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 
 * 基于Jackson的json工具
 * 
 * 
 */
public class JsonUtil{
	private static ObjectMapper mapper = new ObjectMapper();

	/**
	 * 
	 * 构造函数,Date类型与字符串的转换格式采用默认值：yyyy-MM-dd HH:mm:ss
	 * 
	 *
	 */
	static
	{
		mapper.setDateFormat(new SimpleDateFormat(DateUtil.C_TIME_PATTON_DEFAULT));
		//mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//有这句为null的成员将不出现在json中
	}
	
	/**
	 * 
	 * 构造函数,指定Date类型与字符串的转换格式
	 * 
	 * @param timeFormat 指定Date类型与字符串的转换格式,例如：yyyy-MM-dd HH:mm:ss
	 *
	 */
	public static void setTimeFormat(String timeFormat)
	{
		mapper.setDateFormat(new SimpleDateFormat(timeFormat));
		//mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//有这句为null的成员将不出现在json中
	}
	
	/**
	 * 
	 * 将json字符串转换为指定的类型<br>
	 * 不保证在多线程中下实例方法的线程安全
	 * 示例：testBean2 newBean =new JsonUtil().toObject(jsonStr, testBean2.class);
	 * 
	 * @param jsonStr
	 *            json字符串
	 * @param clazz
	 *            要转换成的目标类，需满足以下要求<br>
	 *            1. 成员必须有set,get函数（eclipse自动生成)<br>
	 *            2. 具备无参数的构造函数,且是public<br>
	 * @return 转换成的目标类实例,异常时返回null
	 */
	public static <T>T toObject(String jsonStr, Class<T> clazz) {
		try {
			return mapper.readValue(jsonStr, clazz);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 
	 * json字符串转换为Map<String, valueClass><br>
	 * 不保证在多线程中下实例方法的线程安全
	 * 示例:Map<String,testBean3> newMap = new JsonUtil().toMap(jsonStr,
	 * testBean3.class);<br>
	 * 
	 * @param jsonStr
	 *            json字符串
	 * @param clazz
	 *            Map键值对中value的类，需满足以下要求<br>
	 *            1. 成员必须有set,get函数（eclipse自动生成)<br>
	 *            2. 具备无参数的构造函数,且是public<br>
	 * @return 转换成的Map实例,异常时返回null
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> Map<String, T> toMap(String jsonStr, Class<T> clazz) {
		try {
			JavaType javaType = mapper.getTypeFactory().constructParametricType(HashMap.class, String.class, clazz);
			return (HashMap<String, T>) mapper.readValue(jsonStr, javaType);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}	
	
	/**
	 * 
	 * 将json字符串转换为指定类的List<br>
	 * 不保证在多线程中下实例方法的线程安全
	 * 示例:List<testBean11> newList = new JsonUtil().toList(jsonStr, testBean11.class);<br>
	 * 
	 * @param jsonStr
	 *            json字符串
	 * @param clazz
	 *            指定类，需满足以下要求<br>
	 *            1. 成员必须有set,get函数（eclipse自动生成)<br>
	 *            2. 具备无参数的构造函数,且是public<br>
	 * @return 要转换成的List实例,异常时返回null
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> toList(String jsonStr, Class<T> clazz) {
		try {
			JavaType javaType = mapper.getTypeFactory().constructParametricType(ArrayList.class, clazz);
			return (List<T>) mapper.readValue(jsonStr, javaType);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 返回任意对象的Json字符串
	 * 不保证在多线程中下实例方法的线程安全
	 * @param obj
	 *            对象实例
	 *            
	 * @return 对象的Json字符串,,异常时返回空字符串
	 */
	public static String toJson(Object obj) {
			try {
				return mapper.writeValueAsString(obj);
			} catch (JsonProcessingException e) {
				e.printStackTrace();
				return "";
			}
	}

}
